﻿using System;
using System.Collections.Generic;
using Cysharp.Threading.Tasks;

namespace KuiHuaBaoDian.Services.UGUI {

    /// <summary>
    /// 标准UI事件
    /// </summary>
    public interface IUIEvent {
    }

    /// <summary>
    /// 可处理任务的UI事件
    /// </summary>
    public interface IUIEventTaskProcessing : IUIEvent {

        /// <summary>
        /// 【可选】对单独一次触发事件的处理函数，如不设置则按常规依次await监听运回的任务，
        /// 进入参数为监听返回的任务，返回值为函数处理后交付单次await的任务，
        /// 如果想为每一个单次触发不进行等待，比如转交至所有触发完成时再等待，可以在处理函数中直接返回<see cref="UniTask.CompletedTask"/>
        /// </summary>
        Func<UniTask, UniTask> OnTask { get; }

        /// <summary>
        /// 【可选】整个事件触发全部处理后的汇总处理函数，如不设置则直接跳过，
        /// 参数1为每个单次触发但未经<see cref="OnTask"/>处理前监听返回的任务列表，参数2为每个单次触发经<see cref="OnTask"/>处理后返回的任务列表，返回值为交付最终await的任务，
        /// </summary>
        Func<IEnumerable<UniTask>, IEnumerable<UniTask>, UniTask> OnTasks { get; }
    }

    public abstract class KHBD_UIEvent : IUIEvent {
    }

    public abstract class KHBD_UIEventTaskProcessing : KHBD_UIEvent, IUIEventTaskProcessing {

        public Func<UniTask, UniTask> OnTask { get; init; }

        public Func<IEnumerable<UniTask>, IEnumerable<UniTask>, UniTask> OnTasks { get; init; }
    }
}
